package com.hua.controller;


import com.hua.pojo.FoodClass;
import com.hua.service.FoodClassService;
import com.hua.service.FoodService;
import com.hua.utils.HandleTokenUtils;
import com.hua.utils.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.hua.utils.JwtUtils;
import com.hua.pojo.User;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author hua
 * @since 2023-12-24
 */
@Slf4j
@Api(tags = "菜品类别管理")
@RestController
@RequestMapping("/food-class")
public class FoodClassController {

    @Autowired
    private FoodClassService foodClassService;
    @Autowired
    private FoodService foodService;
    @Autowired//处理jwt是否有效
    private HandleTokenUtils handleTokenUtils;
    @Autowired//解析jwt
    private JwtUtils jwtUtils;





    @ApiOperation("获取首页饭堂显示列表API----根据饭堂id查询菜品类别数据")
    @PostMapping("/getFoodClassListById")
    public Result getFoodClassListById(@RequestBody Map<String, Object> requestData){

        int canteenId = (int) requestData.get("canteenId");

        //调用数据层查询结果返回
        Map<String, Object> foodClassList = foodClassService.getFoodClassListById(canteenId);
        //把查询出来的数据返回给前端
        return Result.success(foodClassList,"根据饭堂id查询菜品类别数据成功！");
    }















    //管理端

    /**
     * 管理端————①菜品类别的删除（先更新菜品类别的所属id，再删除该类别，需要事务处理）
     * @param requestData
     * @return
     */
    @ApiOperation("管理端——①菜品类别的删除（实际为更新该类别的所有菜品的类别id,把其分到固定的未分类）")
    @PostMapping("/deleteFoodClassById")
    public Result deleteFoodClassById(@RequestBody Map<String, Object> requestData){

        String token = (String) requestData.get("token");
        int canteenId = (int) requestData.get("canteenId");
        String ids = (String) requestData.get("ids");//这是类别的id字符串





        /**
         * 处理token
         */
        //判断jwt是否还有效
        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
        if(!b){//登录失效返回20002状态码
            return Result.loginFailure();
        }


        //登录有效
        //解析token封装到对象
        User user = jwtUtils.parseToken(token, User.class);

        //从对象中获取permission
        int permission = user.getPermission();




        //对foodClassNames进行处理
        //数据格式化处理
        String[] idsList ;
        if (ids.contains("/")) {
            idsList = ids.split("/");
        } else {
            idsList = new String[]{ids};
        }


        //权限处理
        if(permission==1){//普通用户
            return Result.fail("普通用户无权执行该操作！");
        }else if(permission==2){//超级管理员


            //①执行更新操作。根据饭堂id来对菜品的类别id进行更新，归类到未分类
            //1357对应四个饭堂的未分类：一饭一楼、一饭三楼、二饭、三饭

            Map<String, Object> Map=new HashMap<>();
            for (String classId : idsList) {
                if(canteenId==1){
                    //把该类别下的所有菜品的类别id进行更新1
                    int i = foodService.updateClassIdToDefaultValue(classId, 1);

                }else if(canteenId==2){
                    //把该类别下的所有菜品的类别id进行更新3
                    int i = foodService.updateClassIdToDefaultValue(classId, 3);
                }
                else if(canteenId==3){
                    //把该类别下的所有菜品的类别id进行更新5
                    int i = foodService.updateClassIdToDefaultValue(classId, 5);
                }
                else if(canteenId==4){
                    //把该类别下的所有菜品的类别id进行更新7
                    int i = foodService.updateClassIdToDefaultValue(classId, 7);
                }


                //②执行删除类别操作，批量
                int deleted = foodClassService.deleteFoodClassByIds(classId);
                if(deleted!=0){//删除类别成功
                    Map.put(classId,"删除成功！");
                }

            }
            if(Map==null){
                return Result.fail("系统出错，删除失败~~~");
            }else{
                return Result.success(Map,"删除成功！");
            }





        }else if(permission==3){//第一饭堂一楼管理
            if(canteenId==1){//如果对于饭堂id，就执行
                //①执行更新操作。根据饭堂id来对菜品的类别id进行更新，归类到未分类
                //1357对应四个饭堂的未分类：一饭一楼、一饭三楼、二饭、三饭

                Map<String, Object> Map=new HashMap<>();
                for (String classId : idsList) {
                    if(canteenId==1){
                        //把该类别下的所有菜品的类别id进行更新1
                        int i = foodService.updateClassIdToDefaultValue(classId, 1);

                    }else if(canteenId==2){
                        //把该类别下的所有菜品的类别id进行更新3
                        int i = foodService.updateClassIdToDefaultValue(classId, 3);
                    }
                    else if(canteenId==3){
                        //把该类别下的所有菜品的类别id进行更新5
                        int i = foodService.updateClassIdToDefaultValue(classId, 5);
                    }
                    else if(canteenId==4){
                        //把该类别下的所有菜品的类别id进行更新7
                        int i = foodService.updateClassIdToDefaultValue(classId, 7);
                    }


                    //②执行删除类别操作，批量
                    int deleted = foodClassService.deleteFoodClassByIds(classId);
                    if(deleted!=0){//删除类别成功
                        Map.put(classId,"删除成功！");
                    }

                }
                if(Map==null){
                    return Result.fail("系统出错，删除失败~~~");
                }else{
                    return Result.success(Map,"删除成功！");
                }

            }else{
                return Result.fail("第一饭堂一楼管理者无删除其它饭堂菜品《类别》的权限！");
            }

        }else if(permission==4){//第一饭堂三楼管理
            if(canteenId==2){//如果对应饭堂id，就执行
                //①执行更新操作。根据饭堂id来对菜品的类别id进行更新，归类到未分类
                //1357对应四个饭堂的未分类：一饭一楼、一饭三楼、二饭、三饭

                Map<String, Object> Map=new HashMap<>();
                for (String classId : idsList) {
                    if(canteenId==1){
                        //把该类别下的所有菜品的类别id进行更新1
                        int i = foodService.updateClassIdToDefaultValue(classId, 1);

                    }else if(canteenId==2){
                        //把该类别下的所有菜品的类别id进行更新3
                        int i = foodService.updateClassIdToDefaultValue(classId, 3);
                    }
                    else if(canteenId==3){
                        //把该类别下的所有菜品的类别id进行更新5
                        int i = foodService.updateClassIdToDefaultValue(classId, 5);
                    }
                    else if(canteenId==4){
                        //把该类别下的所有菜品的类别id进行更新7
                        int i = foodService.updateClassIdToDefaultValue(classId, 7);
                    }


                    //②执行删除类别操作，批量
                    int deleted = foodClassService.deleteFoodClassByIds(classId);
                    if(deleted!=0){//删除类别成功
                        Map.put(classId,"删除成功！");
                    }

                }
                if(Map==null){
                    return Result.fail("系统出错，删除失败~~~");
                }else{
                    return Result.success(Map,"删除成功！");
                }

            }else{
                return Result.fail("第一饭堂三楼管理者无删除其它饭堂菜品《类别》的权限！");
            }

        }else if(permission==5){//第二饭堂管理

            if(canteenId==3){//如果对应饭堂id，就执行
                //①执行更新操作。根据饭堂id来对菜品的类别id进行更新，归类到未分类
                //1357对应四个饭堂的未分类：一饭一楼、一饭三楼、二饭、三饭

                Map<String, Object> Map=new HashMap<>();
                for (String classId : idsList) {
                    if(canteenId==1){
                        //把该类别下的所有菜品的类别id进行更新1
                        int i = foodService.updateClassIdToDefaultValue(classId, 1);

                    }else if(canteenId==2){
                        //把该类别下的所有菜品的类别id进行更新3
                        int i = foodService.updateClassIdToDefaultValue(classId, 3);
                    }
                    else if(canteenId==3){
                        //把该类别下的所有菜品的类别id进行更新5
                        int i = foodService.updateClassIdToDefaultValue(classId, 5);
                    }
                    else if(canteenId==4){
                        //把该类别下的所有菜品的类别id进行更新7
                        int i = foodService.updateClassIdToDefaultValue(classId, 7);
                    }


                    //②执行删除类别操作，批量
                    int deleted = foodClassService.deleteFoodClassByIds(classId);
                    if(deleted!=0){//删除类别成功
                        Map.put(classId,"删除成功！");
                    }

                }
                if(Map==null){
                    return Result.fail("系统出错，删除失败~~~");
                }else{
                    return Result.success(Map,"删除成功！");
                }

            }else{
                return Result.fail("第二饭堂管理者无删除其它饭堂菜品《类别》的权限！");
            }

        }else if(permission==6){//第三饭堂管理

            if(canteenId==4){//如果对应饭堂id，就执行
                //①执行更新操作。根据饭堂id来对菜品的类别id进行更新，归类到未分类
                //1357对应四个饭堂的未分类：一饭一楼、一饭三楼、二饭、三饭

                Map<String, Object> Map=new HashMap<>();
                for (String classId : idsList) {
                    if(canteenId==1){
                        //把该类别下的所有菜品的类别id进行更新1
                        int i = foodService.updateClassIdToDefaultValue(classId, 1);

                    }else if(canteenId==2){
                        //把该类别下的所有菜品的类别id进行更新3
                        int i = foodService.updateClassIdToDefaultValue(classId, 3);
                    }
                    else if(canteenId==3){
                        //把该类别下的所有菜品的类别id进行更新5
                        int i = foodService.updateClassIdToDefaultValue(classId, 5);
                    }
                    else if(canteenId==4){
                        //把该类别下的所有菜品的类别id进行更新7
                        int i = foodService.updateClassIdToDefaultValue(classId, 7);
                    }


                    //②执行删除类别操作，批量
                    int deleted = foodClassService.deleteFoodClassByIds(classId);
                    if(deleted!=0){//删除类别成功
                        Map.put(classId,"删除成功！");
                    }

                }
                if(Map==null){
                    return Result.fail("系统出错，删除失败~~~");
                }else{
                    return Result.success(Map,"删除成功！");
                }

            }else{
                return Result.fail("第三饭堂管理者无删除其它饭堂菜品《类别》的权限！");
            }

        }else{
            return Result.fail("系统出错，删除失败~~~");
        }
    }



    /**（修改完成2024/2/14）
     * 管理端————②菜品类别信息的修改
     * @param requestData
     * @return
     */
    @ApiOperation("管理端——②菜品类别信息的修改")
    @PostMapping("/modifyFoodClass")
    public Result modifyFoodClass(@RequestBody Map<String, Object> requestData){

        String token = (String) requestData.get("token");
        int canteenId = (int) requestData.get("canteenId");
        int id = (int) requestData.get("id");
        //String classDescription=(String)requestData.get("classDescription");
        String foodClassName=(String)requestData.get("foodClassName");



        /**
         * 处理token
         */
        //判断jwt是否还有效
        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
        if(!b){//登录失效返回20002状态码
            return Result.loginFailure();
        }



        //登录有效
        //解析token封装到对象
        User user = jwtUtils.parseToken(token, User.class);

        //从对象中获取permission
        int permission = user.getPermission();


        //封装FoodClass:
        FoodClass foodClass = new FoodClass();
        foodClass.setFoodClassName(foodClassName);
        foodClass.setId(id);
        foodClass.setCanteenId(canteenId);





        //权限处理
        if(permission==1){//普通用户
            return Result.fail("普通用户无权执行该操作！");
        }else if(permission==2){//超级管理员
            //执行修改操作
            Map<String, Object> modifyFoodClassResult = foodClassService.modifyFoodClass(foodClass);
            if(modifyFoodClassResult==null){
                return Result.fail("系统出错，修改失败~~~");
            }else{
                return Result.success(modifyFoodClassResult,"修改成功！");
            }
        }else if(permission==3){//第一饭堂一楼管理
            if(canteenId==1){//如果对于饭堂id，就执行
                //执行修改操作
                Map<String, Object> modifyFoodClassResult = foodClassService.modifyFoodClass(foodClass);
                if(modifyFoodClassResult==null){
                    return Result.fail("系统出错，修改失败~~~");
                }else{
                    return Result.success(modifyFoodClassResult,"修改成功！");
                }
            }else{
                return Result.fail("第一饭堂一楼管理者无修改其它饭堂菜品《类别》的权限！");
            }

        }else if(permission==4){//第一饭堂三楼管理
            if(canteenId==2){//如果对应饭堂id，就执行
                //执行修改操作
                Map<String, Object> modifyFoodClassResult = foodClassService.modifyFoodClass(foodClass);
                if(modifyFoodClassResult==null){
                    return Result.fail("系统出错，修改失败~~~");
                }else{
                    return Result.success(modifyFoodClassResult,"修改成功！");
                }
            }else{
                return Result.fail("第一饭堂三楼管理者无修改其它饭堂菜品《类别》的权限！");
            }

        }else if(permission==5){//第二饭堂管理

            if(canteenId==3){//如果对应饭堂id，就执行
                //执行修改操作
                Map<String, Object> modifyFoodClassResult = foodClassService.modifyFoodClass(foodClass);
                if(modifyFoodClassResult==null){
                    return Result.fail("系统出错，修改失败~~~");
                }else{
                    return Result.success(modifyFoodClassResult,"修改成功！");
                }
            }else{
                return Result.fail("第二饭堂管理者无修改其它饭堂菜品《类别》的权限！");
            }

        }else if(permission==6){//第三饭堂管理

            if(canteenId==4){//如果对应饭堂id，就执行
                //执行修改操作
                Map<String, Object> modifyFoodClassResult = foodClassService.modifyFoodClass(foodClass);
                if(modifyFoodClassResult==null){
                    return Result.fail("系统出错，修改失败~~~");
                }else{
                    return Result.success(modifyFoodClassResult,"修改成功！");
                }
            }else{
                return Result.fail("第三饭堂管理者无修改其它饭堂菜品《类别》的权限！");
            }

        }else{
            return Result.fail("系统出错，修改失败~~~");
        }
    }


    /**（修改完成2024/2/14）
     * 管理端————③菜品类别的新增
     * @param requestData
     * @return
     */
    @ApiOperation("管理端——③菜品类别的新增")
    @PostMapping("/addFoodClass")
    public Result addFoodClass(@RequestBody Map<String, Object> requestData){

        String token = (String) requestData.get("token");
        int canteenId = (int) requestData.get("canteenId");
        String foodClassNames=(String)requestData.get("foodClassName");//是字符串来的，多个类别名称。以/分割


        /**
         * 处理token
         */
        //判断jwt是否还有效
        boolean b = handleTokenUtils.checkJWTIsLost(token, User.class);
        if(!b){//登录失效返回20002状态码
            return Result.loginFailure();
        }



        //登录有效
        //解析token
        User user = jwtUtils.parseToken(token, User.class);

        //获取permission
        int permission = user.getPermission();


        //对foodClassNames进行处理
        //数据格式化处理
        String[] foodClassNamesList ;
        if (foodClassNames.contains("/")) {
            foodClassNamesList = foodClassNames.split("/");
        } else {
            foodClassNamesList = new String[]{foodClassNames};
        }

        //封装成列表对象:
        List<FoodClass> foodClassList = new ArrayList<>();
        for (String className : foodClassNamesList) {
            FoodClass foodClass = new FoodClass();
            foodClass.setFoodClassName(className);
            foodClass.setCanteenId(canteenId);
            foodClassList.add(foodClass);
            log.info("对象："+foodClass);
        }







        //权限处理
        if(permission==1){//普通用户
            return Result.fail("普通用户无权执行该操作！");
        }else if(permission==2){//超级管理员

            //执行批量新增操作
            Map<String, Object> addFoodClassListResult = foodClassService.addFoodClassList(foodClassList);
            if (addFoodClassListResult == null) {
                return Result.fail("系统出错，新增失败~~~");
            } else {
                return Result.success(addFoodClassListResult, "新增成功！");
            }

        }else if(permission==3){//第一饭堂一楼管理
            if(canteenId==1){//如果对于饭堂id，就执行
                //执行批量新增操作
                Map<String, Object> addFoodClassListResult = foodClassService.addFoodClassList(foodClassList);
                if(addFoodClassListResult==null){
                    return Result.fail("系统出错，新增失败~~~");
                }else{
                    return Result.success(addFoodClassListResult,"新增成功！");
                }
            }else{
                return Result.fail("第一饭堂一楼管理者无新增其它饭堂菜品《类别》的权限！");
            }

        }else if(permission==4){//第一饭堂三楼管理
            if(canteenId==2){//如果对应饭堂id，就执行
                //执行批量新增操作
                Map<String, Object> addFoodClassListResult = foodClassService.addFoodClassList(foodClassList);
                if(addFoodClassListResult==null){
                    return Result.fail("系统出错，新增失败~~~");
                }else{
                    return Result.success(addFoodClassListResult,"新增成功！");
                }
            }else{
                return Result.fail("第一饭堂三楼管理者无新增其它饭堂菜品《类别》的权限！");
            }

        }else if(permission==5){//第二饭堂管理

            if(canteenId==3){//如果对应饭堂id，就执行
                //执行批量新增操作
                Map<String, Object> addFoodClassListResult = foodClassService.addFoodClassList(foodClassList);
                if(addFoodClassListResult==null){
                    return Result.fail("系统出错，新增失败~~~");
                }else{
                    return Result.success(addFoodClassListResult,"新增成功！");
                }
            }else{
                return Result.fail("第二饭堂管理者无新增其它饭堂菜品《类别》的权限！");
            }

        }else if(permission==6){//第三饭堂管理

            if(canteenId==4){//如果对应饭堂id，就执行
                //执行批量新增操作
                Map<String, Object> addFoodClassListResult = foodClassService.addFoodClassList(foodClassList);
                if(addFoodClassListResult==null){
                    return Result.fail("系统出错，新增失败~~~");
                }else{
                    return Result.success(addFoodClassListResult,"新增成功！");
                }
            }else{
                return Result.fail("第三饭堂管理者无新增其它饭堂菜品《类别》的权限！");
            }

        }else{
            return Result.fail("系统出错，修改失败~~~");
        }
    }
}

